{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Learn Keras for Deep Neural Networks\n",
    "## Chapter 4 - Deep Neural Networks for Supervised Learning - Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Import the necessary packages\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns \n",
    "from keras import Sequential\n",
    "%matplotlib inline\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Import the dataset into Memory\n",
    "* The datasets are available to downnload from the Kaggle Competition  - https://www.kaggle.com/c/predicting-red-hat-business-value  \n",
    "* You must register with Kaggle and accept the rules of the competition before downloading the data.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Import the 2 datasets provided in the Zip Folder\n",
    "df = pd.read_csv(\"/Users/jmoolay/Personal/Apress/Learn Keras for DNN/Chapter 4/Data/act_train.csv\")\n",
    "people = pd.read_csv(\"/Users/jmoolay/Personal/Apress/Learn Keras for DNN/Chapter 4/Data/people.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data Exploration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape of DF: (2197291, 6)\n",
      "Shape of People DF: (189118, 41)\n"
     ]
    }
   ],
   "source": [
    "#Explore the shape of the datasets\n",
    "print(\"Shape of DF:\",df.shape)\n",
    "print(\"Shape of People DF:\",people.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>people_id</th>\n",
       "      <th>activity_id</th>\n",
       "      <th>date</th>\n",
       "      <th>activity_category</th>\n",
       "      <th>char_1</th>\n",
       "      <th>char_2</th>\n",
       "      <th>char_3</th>\n",
       "      <th>char_4</th>\n",
       "      <th>char_5</th>\n",
       "      <th>char_6</th>\n",
       "      <th>char_7</th>\n",
       "      <th>char_8</th>\n",
       "      <th>char_9</th>\n",
       "      <th>char_10</th>\n",
       "      <th>outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>act2_1734928</td>\n",
       "      <td>2023-08-26</td>\n",
       "      <td>type 4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>type 76</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>act2_2434093</td>\n",
       "      <td>2022-09-27</td>\n",
       "      <td>type 2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>type 1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>act2_3404049</td>\n",
       "      <td>2022-09-27</td>\n",
       "      <td>type 2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>type 1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>act2_3651215</td>\n",
       "      <td>2023-08-04</td>\n",
       "      <td>type 2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>type 1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>act2_4109017</td>\n",
       "      <td>2023-08-26</td>\n",
       "      <td>type 2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>type 1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  people_id   activity_id        date activity_category char_1 char_2 char_3  \\\n",
       "0   ppl_100  act2_1734928  2023-08-26            type 4    NaN    NaN    NaN   \n",
       "1   ppl_100  act2_2434093  2022-09-27            type 2    NaN    NaN    NaN   \n",
       "2   ppl_100  act2_3404049  2022-09-27            type 2    NaN    NaN    NaN   \n",
       "3   ppl_100  act2_3651215  2023-08-04            type 2    NaN    NaN    NaN   \n",
       "4   ppl_100  act2_4109017  2023-08-26            type 2    NaN    NaN    NaN   \n",
       "\n",
       "  char_4 char_5 char_6 char_7 char_8 char_9  char_10  outcome  \n",
       "0    NaN    NaN    NaN    NaN    NaN    NaN  type 76        0  \n",
       "1    NaN    NaN    NaN    NaN    NaN    NaN   type 1        0  \n",
       "2    NaN    NaN    NaN    NaN    NaN    NaN   type 1        0  \n",
       "3    NaN    NaN    NaN    NaN    NaN    NaN   type 1        0  \n",
       "4    NaN    NaN    NaN    NaN    NaN    NaN   type 1        0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Explore the contents of the first dataset\n",
    "df.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "people_id            0.000000\n",
       "activity_id          0.000000\n",
       "date                 0.000000\n",
       "activity_category    0.000000\n",
       "char_1               0.928268\n",
       "char_2               0.928268\n",
       "char_3               0.928268\n",
       "char_4               0.928268\n",
       "char_5               0.928268\n",
       "char_6               0.928268\n",
       "char_7               0.928268\n",
       "char_8               0.928268\n",
       "char_9               0.928268\n",
       "char_10              0.071732\n",
       "outcome              0.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Calculating the % of Null values in each column for activity data\n",
    "df.isnull().sum()/df.shape[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>people_id</th>\n",
       "      <th>char_1</th>\n",
       "      <th>group_1</th>\n",
       "      <th>char_2</th>\n",
       "      <th>date</th>\n",
       "      <th>char_3</th>\n",
       "      <th>char_4</th>\n",
       "      <th>char_5</th>\n",
       "      <th>char_6</th>\n",
       "      <th>char_7</th>\n",
       "      <th>...</th>\n",
       "      <th>char_29</th>\n",
       "      <th>char_30</th>\n",
       "      <th>char_31</th>\n",
       "      <th>char_32</th>\n",
       "      <th>char_33</th>\n",
       "      <th>char_34</th>\n",
       "      <th>char_35</th>\n",
       "      <th>char_36</th>\n",
       "      <th>char_37</th>\n",
       "      <th>char_38</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ppl_100</td>\n",
       "      <td>type 2</td>\n",
       "      <td>group 17304</td>\n",
       "      <td>type 2</td>\n",
       "      <td>2021-06-29</td>\n",
       "      <td>type 5</td>\n",
       "      <td>type 5</td>\n",
       "      <td>type 5</td>\n",
       "      <td>type 3</td>\n",
       "      <td>type 11</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ppl_100002</td>\n",
       "      <td>type 2</td>\n",
       "      <td>group 8688</td>\n",
       "      <td>type 3</td>\n",
       "      <td>2021-01-06</td>\n",
       "      <td>type 28</td>\n",
       "      <td>type 9</td>\n",
       "      <td>type 5</td>\n",
       "      <td>type 3</td>\n",
       "      <td>type 11</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ppl_100003</td>\n",
       "      <td>type 2</td>\n",
       "      <td>group 33592</td>\n",
       "      <td>type 3</td>\n",
       "      <td>2022-06-10</td>\n",
       "      <td>type 4</td>\n",
       "      <td>type 8</td>\n",
       "      <td>type 5</td>\n",
       "      <td>type 2</td>\n",
       "      <td>type 5</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>99</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ppl_100004</td>\n",
       "      <td>type 2</td>\n",
       "      <td>group 22593</td>\n",
       "      <td>type 3</td>\n",
       "      <td>2022-07-20</td>\n",
       "      <td>type 40</td>\n",
       "      <td>type 25</td>\n",
       "      <td>type 9</td>\n",
       "      <td>type 4</td>\n",
       "      <td>type 16</td>\n",
       "      <td>...</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ppl_100006</td>\n",
       "      <td>type 2</td>\n",
       "      <td>group 6534</td>\n",
       "      <td>type 3</td>\n",
       "      <td>2022-07-27</td>\n",
       "      <td>type 40</td>\n",
       "      <td>type 25</td>\n",
       "      <td>type 9</td>\n",
       "      <td>type 3</td>\n",
       "      <td>type 8</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>84</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 41 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    people_id  char_1      group_1  char_2        date   char_3   char_4  \\\n",
       "0     ppl_100  type 2  group 17304  type 2  2021-06-29   type 5   type 5   \n",
       "1  ppl_100002  type 2   group 8688  type 3  2021-01-06  type 28   type 9   \n",
       "2  ppl_100003  type 2  group 33592  type 3  2022-06-10   type 4   type 8   \n",
       "3  ppl_100004  type 2  group 22593  type 3  2022-07-20  type 40  type 25   \n",
       "4  ppl_100006  type 2   group 6534  type 3  2022-07-27  type 40  type 25   \n",
       "\n",
       "   char_5  char_6   char_7   ...    char_29 char_30  char_31  char_32  \\\n",
       "0  type 5  type 3  type 11   ...      False    True     True    False   \n",
       "1  type 5  type 3  type 11   ...      False    True     True     True   \n",
       "2  type 5  type 2   type 5   ...      False   False     True     True   \n",
       "3  type 9  type 4  type 16   ...       True    True     True     True   \n",
       "4  type 9  type 3   type 8   ...      False   False     True    False   \n",
       "\n",
       "   char_33  char_34  char_35  char_36  char_37  char_38  \n",
       "0    False     True     True     True    False       36  \n",
       "1     True     True     True     True    False       76  \n",
       "2     True     True    False     True     True       99  \n",
       "3     True     True     True     True     True       76  \n",
       "4    False    False     True     True    False       84  \n",
       "\n",
       "[5 rows x 41 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Explore the contents of People dataset\n",
    "people.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Calculate the % of null values in for the entire dataset\n",
    "people.isnull().sum().sum()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Columns to remove: ['char_1', 'char_2', 'char_3', 'char_4', 'char_5', 'char_6', 'char_7', 'char_8', 'char_9']\n",
      "Shape of DF: (2197291, 6)\n"
     ]
    }
   ],
   "source": [
    "#Create the list of columns to drop from activity data\n",
    "columns_to_remove = [\"char_\"+str(x) for x in  np.arange(1,10)]\n",
    "print(\"Columns to remove:\",columns_to_remove)\n",
    "\n",
    "#Remove the columns from the activity data\n",
    "df = df[list(set(df.columns) - set(columns_to_remove))]\n",
    "\n",
    "#Rename the 2 columns to avoid name clashes in merged data\n",
    "df = df.rename(columns={\"date\":\"activity_date\",\"char_10\":\"activity_type\"})\n",
    "\n",
    "#Replace nulls in the activity_type column with the mode\n",
    "df[\"activity_type\"] = df[\"activity_type\"].fillna(df[\"activity_type\"].mode()[0])\n",
    "\n",
    "#Print the shape of the final activity dataset\n",
    "print(\"Shape of DF:\",df.shape)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape before merging: (2197291, 6)\n",
      "Shape after merging : (2197291, 46)\n"
     ]
    }
   ],
   "source": [
    "#Merge the 2 datasets on 'people_id' key\n",
    "df_new = df.merge(people,on=[\"people_id\"],how=\"inner\")\n",
    "print(\"Shape before merging:\",df.shape)\n",
    "print(\"Shape after merging :\",df_new.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Unique values for outcome: [0 1]\n",
      "\n",
      "Percentage of distribution for outcome-\n",
      "0    0.556046\n",
      "1    0.443954\n",
      "Name: outcome, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print(\"Unique values for outcome:\",df_new[\"outcome\"].unique())\n",
    "print(\"\\nPercentage of distribution for outcome-\")\n",
    "print(df_new[\"outcome\"].value_counts()/df_new.shape[0])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data Engineering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Distinct DataTypes: [dtype('O'), dtype('int64'), dtype('bool')]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#Checking the distinct datatypes in the dataset\n",
    "print(\"Distinct DataTypes:\",list(df_new.dtypes.unique()))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Boolean columns - \n",
      " ['char_10' 'char_11' 'char_12' 'char_13' 'char_14' 'char_15' 'char_16'\n",
      " 'char_17' 'char_18' 'char_19' 'char_20' 'char_21' 'char_22' 'char_23'\n",
      " 'char_24' 'char_25' 'char_26' 'char_27' 'char_28' 'char_29' 'char_30'\n",
      " 'char_31' 'char_32' 'char_33' 'char_34' 'char_35' 'char_36' 'char_37']\n",
      "\n",
      "Distinct DataTypes after processing: [dtype('O') dtype('int64')]\n"
     ]
    }
   ],
   "source": [
    "#Create a temp dataset with the datatype of columns\n",
    "temp = pd.DataFrame(df_new.dtypes)\n",
    "temp.columns = [\"DataType\"]\n",
    "#Create a list with names of all Boolean columns\n",
    "boolean_columns = temp.index[temp[\"DataType\"] == 'bool'].values\n",
    "\n",
    "print(\"Boolean columns - \\n\",boolean_columns)\n",
    "\n",
    "#Convert all boolean columns to Binary numeric values\n",
    "for column in boolean_columns:\n",
    "    df_new[column] = np.where(df_new[column] == True,1,0)\n",
    "\n",
    "print(\"\\nDistinct DataTypes after processing:\",df.dtypes.unique())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "activity_date column has : 411 distinct values\n",
      "people_id column has : 151295 distinct values\n",
      "activity_id column has : 2197291 distinct values\n",
      "activity_category column has : 7 distinct values\n",
      "activity_type column has : 6515 distinct values\n",
      "char_1 column has : 2 distinct values\n",
      "group_1 column has : 29899 distinct values\n",
      "char_2 column has : 3 distinct values\n",
      "date column has : 1196 distinct values\n",
      "char_3 column has : 43 distinct values\n",
      "char_4 column has : 25 distinct values\n",
      "char_5 column has : 9 distinct values\n",
      "char_6 column has : 7 distinct values\n",
      "char_7 column has : 25 distinct values\n",
      "char_8 column has : 8 distinct values\n",
      "char_9 column has : 9 distinct values\n"
     ]
    }
   ],
   "source": [
    "#Extracting the object columns from the above dataframe\n",
    "categorical_columns = temp.index[temp[\"DataType\"] == 'O'].values\n",
    "\n",
    "#Check the number of distinct values in each categorical column\n",
    "for column in categorical_columns:\n",
    "    print(column+\" column has :\",str(len(df_new[column].unique()))+\" distinct values\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape of data after create Date Features: (2197291, 56)\n"
     ]
    }
   ],
   "source": [
    "#Create date related features for 'date' in customer data\n",
    "df_new[\"date\"] = pd.to_datetime(df_new[\"date\"])\n",
    "\n",
    "df_new[\"Year\"] = df_new[\"date\"].dt.year\n",
    "df_new[\"Month\"] = df_new[\"date\"].dt.month\n",
    "df_new[\"Quarter\"] = df_new[\"date\"].dt.quarter\n",
    "df_new[\"Week\"] = df_new[\"date\"].dt.week\n",
    "df_new[\"WeekDay\"] = df_new[\"date\"].dt.weekday\n",
    "df_new[\"Day\"] = df_new[\"date\"].dt.day\n",
    "\n",
    "#Create date related features for 'date' in activity data\n",
    "df_new[\"activity_date\"] = pd.to_datetime(df_new[\"activity_date\"])\n",
    "\n",
    "df_new[\"Activity_Year\"] = df_new[\"activity_date\"].dt.year\n",
    "df_new[\"Activity_Month\"] = df_new[\"activity_date\"].dt.month\n",
    "df_new[\"Activity_Quarter\"] = df_new[\"activity_date\"].dt.quarter\n",
    "df_new[\"Activity_Week\"] = df_new[\"activity_date\"].dt.week\n",
    "df_new[\"Activity_WeekDay\"] = df_new[\"activity_date\"].dt.weekday\n",
    "df_new[\"Activity_Day\"] = df_new[\"activity_date\"].dt.day\n",
    "\n",
    "#Delete the original date columns\n",
    "del(df_new[\"date\"])\n",
    "del(df_new[\"activity_date\"])\n",
    "\n",
    "print(\"Shape of data after create Date Features:\",df_new.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  people_id activity_type   activity_id      group_1\n",
      "0   ppl_100       type 76  act2_1734928  group 17304\n",
      "1   ppl_100        type 1  act2_2434093  group 17304\n",
      "2   ppl_100        type 1  act2_3404049  group 17304\n",
      "3   ppl_100        type 1  act2_3651215  group 17304\n",
      "4   ppl_100        type 1  act2_4109017  group 17304\n"
     ]
    }
   ],
   "source": [
    "print(df_new[[\"people_id\",\"activity_type\",\"activity_id\",\"group_1\"]].head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   people_id  activity_type  activity_id  group_1\n",
      "0      100.0             76    1734928.0    17304\n",
      "1      100.0              1    2434093.0    17304\n",
      "2      100.0              1    3404049.0    17304\n",
      "3      100.0              1    3651215.0    17304\n",
      "4      100.0              1    4109017.0    17304\n"
     ]
    }
   ],
   "source": [
    "#For people ID, we would need to extract values after '_'\n",
    "df_new.people_id = df_new.people_id.apply(lambda x:x.split(\"_\")[1])\n",
    "df_new.people_id = pd.to_numeric(df_new.people_id)\n",
    "\n",
    "#For activity ID also, we would need to extract values after '_'\n",
    "df_new.activity_id = df_new.activity_id.apply(lambda x:x.split(\"_\")[1])\n",
    "df_new.activity_id = pd.to_numeric(df_new.activity_id)\n",
    "\n",
    "#For group_1 , we would need to extract values after ' '\n",
    "df_new.group_1 = df_new.group_1.apply(lambda x:x.split(\" \")[1])\n",
    "df_new.group_1 = pd.to_numeric(df_new.group_1)\n",
    "\n",
    "#For activity_type , we would need to extract values after ' '\n",
    "df_new.activity_type = df_new.activity_type.apply(lambda x:x.split(\" \")[1])\n",
    "df_new.activity_type = pd.to_numeric(df_new.activity_type)\n",
    "\n",
    "#Double check the new values in the dataframe\n",
    "print(df_new[[\"people_id\",\"activity_type\",\"activity_id\",\"group_1\"]].head())\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Target column :\n",
      " ['outcome']\n",
      "\n",
      "Numeric columns :\n",
      " ['Activity_Day', 'char_16', 'people_id', 'char_17', 'char_14', 'char_29', 'activity_type', 'Month', 'char_28', 'char_11', 'char_34', 'char_15', 'Activity_WeekDay', 'char_22', 'char_21', 'char_20', 'char_12', 'WeekDay', 'char_37', 'Day', 'Activity_Year', 'char_36', 'activity_id', 'group_1', 'char_33', 'char_38', 'char_19', 'Activity_Month', 'Quarter', 'char_27', 'char_31', 'Year', 'char_18', 'char_23', 'char_32', 'char_26', 'char_35', 'char_30', 'Activity_Week', 'char_25', 'char_10', 'Week', 'char_24', 'Activity_Quarter', 'char_13']\n",
      "\n",
      "Categorical columns :\n",
      " ['activity_category' 'char_1' 'char_2' 'char_3' 'char_4' 'char_5' 'char_6'\n",
      " 'char_7' 'char_8' 'char_9']\n",
      "\n",
      "Shape of final df after onehot encoding: (2197291, 183)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder, OneHotEncoder\n",
    "\n",
    "#Creating a temporary dataframe that hosts column datatypes\n",
    "temp = pd.DataFrame(df_new.dtypes)\n",
    "temp.columns = [\"DataType\"]\n",
    "\n",
    "#Create lists to separate numeric, categorical and target features\n",
    "target = [\"outcome\"]\n",
    "numeric_columns = list(set(temp.index[(temp.DataType ==\"float64\") | (temp.DataType ==\"int64\")].values) - set(target))\n",
    "categorical_columns = temp.index[temp.DataType == \"O\"].values\n",
    "\n",
    "print(\"\\nTarget column :\\n\",target)\n",
    "print(\"\\nNumeric columns :\\n\",numeric_columns)\n",
    "print(\"\\nCategorical columns :\\n\",categorical_columns)\n",
    "\n",
    "#Define a function that will intake the raw dataframe and the column name and return a one hot encoded DF\n",
    "def create_ohe(df, col):\n",
    "    le = LabelEncoder()\n",
    "    a=le.fit_transform(df_new[col]).reshape(-1,1)\n",
    "    ohe = OneHotEncoder(sparse=False)\n",
    "    column_names = [col+ \"_\"+ str(i) for i in le.classes_]\n",
    "    return(pd.DataFrame(ohe.fit_transform(a),columns =column_names))\n",
    "\n",
    "#Since the above function coverts the column, one at a time\n",
    "#We create a loop to create the final dataset with all features\n",
    "temp = df_new[numeric_columns]\n",
    "for column in categorical_columns:\n",
    "    temp_df = create_ohe(df_new,column)\n",
    "    temp = pd.concat([temp,temp_df],axis=1)\n",
    "\n",
    "print(\"\\nShape of final df after onehot encoding:\",temp.shape)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape of x_train: (1582048, 183)\n",
      "Shape of x_test: (439459, 183)\n",
      "Shape of x_val: (175784, 183)\n",
      "Shape of y_train: (1582048, 1)\n",
      "Shape of y_test: (439459, 1)\n",
      "Shape of y_val: (175784, 1)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "#split the final dataset into train and test with 80:20\n",
    "x_train, x_test, y_train, y_test = train_test_split(temp,df_new[target], \n",
    "test_size=0.2,random_state=2018)\n",
    "#split the train dataset further into train and validation with 90:10\n",
    "x_train, x_val, y_train, y_val = train_test_split(x_train,y_train,\n",
    "test_size=0.1,\n",
    "random_state=2018)\n",
    "\n",
    "#Check the shape of each new dataset created\n",
    "print(\"Shape of x_train:\",x_train.shape)\n",
    "print(\"Shape of x_test:\",x_test.shape)\n",
    "print(\"Shape of x_val:\",x_val.shape)\n",
    "print(\"Shape of y_train:\",y_train.shape)\n",
    "print(\"Shape of y_test:\",y_test.shape)\n",
    "print(\"Shape of y_val:\",y_val.shape)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Designing baseline accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.556046\n",
       "1    0.443954\n",
       "Name: outcome, dtype: float64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Checking the distribution of values in the target\n",
    "df_new[\"outcome\"].value_counts()/df_new.shape[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Designing a Deep Neural Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 71s 45us/step - loss: 7.8509 - acc: 0.5105 - val_loss: 7.1813 - val_acc: 0.5545\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 72s 46us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 64s 41us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a161302b0>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras import Sequential\n",
    "from keras.layers import Dense\n",
    "\n",
    "#Design the deep neural network [Small + 1 layer]\n",
    "model  = Sequential()\n",
    "model.add(Dense(256,input_dim = x_train.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(256,activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\")) #activation = sigmoid for binary classification\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train,y_train, validation_data = (x_val,y_val),epochs=3, batch_size=64)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 68s 43us/step - loss: 8.8665 - acc: 0.4438 - val_loss: 8.8394 - val_acc: 0.4455\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 71s 45us/step - loss: 8.8669 - acc: 0.4438 - val_loss: 8.8394 - val_acc: 0.4455\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 67s 42us/step - loss: 8.8669 - acc: 0.4438 - val_loss: 8.8394 - val_acc: 0.4455\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a17f209e8>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Design the deep neural network [Small + 2 layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(256,input_dim = x_train.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(256,activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train,y_train, validation_data = (x_val,y_val),epochs=3, batch_size=64)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 62s 39us/step - loss: 7.1537 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545: 0s - loss: 7.1536 - acc: 0.\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 62s 39us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545 0s - loss: 7.1529 - acc: 0\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 66s 41us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a18ea30b8>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Design the deep neural network [Medium + 1 layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(512,input_dim = x_train.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train,y_train, validation_data = (x_val,y_val),epochs=3, batch_size=64)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 111s 70us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 110s 69us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545- l\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 125s 79us/step - loss: 7.1534 - acc: 0.5562 - val_loss: 7.1813 - val_acc: 0.5545\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a19a7b9b0>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Design the deep neural network [Medium + 2 layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(512,input_dim = x_train.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(512,activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train,y_train, validation_data = (x_val,y_val),epochs=3, batch_size=64)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Revisiting the training data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dummy Input =  [1 2 3 4 5 6 7 8 9]\n",
      "Output =\n",
      "  [array([-1.54919334]), array([-1.161895]), array([-0.77459667]), array([-0.38729833]), array([0.]), array([0.38729833]), array([0.77459667]), array([1.161895]), array([1.54919334])]\n",
      "Output's Mean =  0.0\n",
      "Output's Std Dev =  1.0\n",
      "\n",
      "After Inverse Transforming = \n",
      " [array([1.]), array([2.]), array([3.]), array([4.]), array([5.]), array([6.]), array([7.]), array([8.]), array([9.])]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/jmoolay/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n",
      "  warnings.warn(msg, DataConversionWarning)\n",
      "/Users/jmoolay/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py:475: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.\n",
      "  warnings.warn(msg, DataConversionWarning)\n"
     ]
    }
   ],
   "source": [
    "#Create a dummy input\n",
    "dummy_input = np.arange(1,10)\n",
    "print(\"Dummy Input = \",dummy_input)\n",
    "\n",
    "from sklearn.preprocessing  import StandardScaler\n",
    "\n",
    "#Create a standardscaler instance and fit the data\n",
    "scaler = StandardScaler()\n",
    "output = scaler.fit_transform(dummy_input.reshape(-1,1))\n",
    "\n",
    "print(\"Output =\\n \",list(output))\n",
    "print(\"Output's Mean = \",output.mean())\n",
    "print(\"Output's Std Dev = \",output.std())\n",
    "print(\"\\nAfter Inverse Transforming = \\n\",list(scaler.inverse_transform(output)))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "scaler.fit(x_train)\n",
    "\n",
    "x_train_scaled = scaler.transform(x_train)\n",
    "x_val_scaled = scaler.transform(x_val)\n",
    "x_test_scaled = scaler.transform(x_test)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Deep Neural Networks for Classification with improved data\n",
    "Let us now, start with a medium sized network to see if we get improved results. We would start with just 3 epochs.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 54s 34us/step - loss: 0.2308 - acc: 0.9000 - val_loss: 0.1912 - val_acc: 0.9213\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 54s 34us/step - loss: 0.1715 - acc: 0.9316 - val_loss: 0.1595 - val_acc: 0.9380\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 56s 35us/step - loss: 0.1487 - acc: 0.9442 - val_loss: 0.1475 - val_acc: 0.9453\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a19dbfe80>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "from keras import Sequential\n",
    "from keras.layers import Dense\n",
    "model  = Sequential()\n",
    "model.add(Dense(512,input_dim = x_train_scaled.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train_scaled,y_train, \n",
    "validation_data = (x_val_scaled,y_val),epochs=3, batch_size=64)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "439459/439459 [==============================] - 8s 19us/step\n",
      "Metric  loss : 0.15\n",
      "Metric  acc : 0.95\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test_scaled,y_test)\n",
    "for i in range(len(model.metrics_names)):\n",
    "    print(\"Metric \",model.metrics_names[i],\":\",str(round(result[i],2)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 110s 70us/step - loss: 0.1950 - acc: 0.9147 - val_loss: 0.1369 - val_acc: 0.9433\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 119s 75us/step - loss: 0.1168 - acc: 0.9531 - val_loss: 0.1087 - val_acc: 0.9573\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 113s 72us/step - loss: 0.0911 - acc: 0.9644 - val_loss: 0.0911 - val_acc: 0.9648\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a19f6f630>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Designing the Deep Neural Network [Medium – 2 Layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(512,input_dim = x_train_scaled.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(512,activation=\"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train_scaled,y_train, validation_data = (x_val_scaled,y_val),epochs=3, batch_size=64)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/3\n",
      "1582048/1582048 [==============================] - 456s 288us/step - loss: 0.1972 - acc: 0.9131 - val_loss: 0.1398 - val_acc: 0.9406\n",
      "Epoch 2/3\n",
      "1582048/1582048 [==============================] - 437s 276us/step - loss: 0.1177 - acc: 0.9520 - val_loss: 0.1115 - val_acc: 0.9558\n",
      "Epoch 3/3\n",
      "1582048/1582048 [==============================] - 793s 501us/step - loss: 0.0917 - acc: 0.9641 - val_loss: 0.0893 - val_acc: 0.9658\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a1b440be0>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Designing the network Deep Neural Network – [Large + 2 Layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(1024,input_dim = x_train_scaled.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(1024,activation = \"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train_scaled,y_train, \n",
    "validation_data = (x_val_scaled,y_val),epochs=3, batch_size=64)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1582048 samples, validate on 175784 samples\n",
      "Epoch 1/15\n",
      "1582048/1582048 [==============================] - 1585s 1ms/step - loss: 0.1954 - acc: 0.9141 - val_loss: 0.1379 - val_acc: 0.9435\n",
      "Epoch 2/15\n",
      "1582048/1582048 [==============================] - 124s 79us/step - loss: 0.1172 - acc: 0.9528 - val_loss: 0.1077 - val_acc: 0.9583\n",
      "Epoch 3/15\n",
      "1582048/1582048 [==============================] - 115s 73us/step - loss: 0.0911 - acc: 0.9645 - val_loss: 0.0884 - val_acc: 0.9663\n",
      "Epoch 4/15\n",
      "1582048/1582048 [==============================] - 115s 73us/step - loss: 0.0763 - acc: 0.9706 - val_loss: 0.0774 - val_acc: 0.9711\n",
      "Epoch 5/15\n",
      "1582048/1582048 [==============================] - 113s 72us/step - loss: 0.0665 - acc: 0.9750 - val_loss: 0.0701 - val_acc: 0.9747loss: 0.0666 - acc: 0. - ETA: 5 - ETA: 0s - loss: 0.0665 - acc: 0.97\n",
      "Epoch 6/15\n",
      "1582048/1582048 [==============================] - 129s 81us/step - loss: 0.0595 - acc: 0.9776 - val_loss: 0.0675 - val_acc: 0.9757\n",
      "Epoch 7/15\n",
      "1582048/1582048 [==============================] - 155s 98us/step - loss: 0.0547 - acc: 0.9797 - val_loss: 0.0649 - val_acc: 0.9774\n",
      "Epoch 8/15\n",
      "1582048/1582048 [==============================] - 120s 76us/step - loss: 0.0503 - acc: 0.9814 - val_loss: 0.0649 - val_acc: 0.9780\n",
      "Epoch 9/15\n",
      "1582048/1582048 [==============================] - 120s 76us/step - loss: 0.0475 - acc: 0.9826 - val_loss: 0.0614 - val_acc: 0.9795\n",
      "Epoch 10/15\n",
      "1582048/1582048 [==============================] - 146s 92us/step - loss: 0.0457 - acc: 0.9837 - val_loss: 0.0600 - val_acc: 0.9800\n",
      "Epoch 11/15\n",
      "1582048/1582048 [==============================] - 148s 94us/step - loss: 0.0425 - acc: 0.9847 - val_loss: 0.0586 - val_acc: 0.9811\n",
      "Epoch 12/15\n",
      "1582048/1582048 [==============================] - 134s 84us/step - loss: 0.0417 - acc: 0.9855 - val_loss: 0.0609 - val_acc: 0.9812\n",
      "Epoch 13/15\n",
      "1582048/1582048 [==============================] - 125s 79us/step - loss: 0.0406 - acc: 0.9860 - val_loss: 0.0598 - val_acc: 0.9822\n",
      "Epoch 14/15\n",
      "1582048/1582048 [==============================] - 115s 73us/step - loss: 0.0408 - acc: 0.9864 - val_loss: 0.0594 - val_acc: 0.9820\n",
      "Epoch 15/15\n",
      "1582048/1582048 [==============================] - 114s 72us/step - loss: 0.0385 - acc: 0.9870 - val_loss: 0.0595 - val_acc: 0.9824\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x1a1ce51390>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Designing the network Deep Neural Network – [Medium + 2 Layers]\n",
    "model  = Sequential()\n",
    "model.add(Dense(512,input_dim = x_train_scaled.shape[1],activation=\"relu\"))\n",
    "model.add(Dense(512,activation = \"relu\"))\n",
    "model.add(Dense(1,activation = \"sigmoid\"))\n",
    "\n",
    "model.compile(optimizer = \"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n",
    "\n",
    "model.fit(x_train_scaled,y_train, validation_data = (x_val_scaled,y_val),epochs=15, batch_size=64)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "439459/439459 [==============================] - 15s 34us/step\n",
      "Metric  loss : 0.06\n",
      "Metric  acc : 0.98\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test_scaled,y_test)\n",
    "\n",
    "for i in range(len(model.metrics_names)):\n",
    "    print(\"Metric \",model.metrics_names[i],\":\",str(round(result[i],2)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotting the final results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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0tLS+PTTTwG46667SEhI4JZbbmlRRlVRVcLC2v7NvWDBgqDH2Z36fc0CICczlVU7ymhstN63xhjf8vLymDRpEjfccAM5OTkUFhYyb948pk2bxsSJE5k/f35z2VNOOYVPP/2U+vp6UlJSuO2225gyZQonnngie/f2vpaMfl+zAMjOTGHh8p18UXKAMekJoQ7HGOPxi3+vY31BRZfuc8KwJO786sRObbt+/XoWLFjAH//4RwDuueceBgwYQH19PWeeeSazZs1iwoSWIxuVl5dz+umnc88993DzzTfzxBNPcNtttx3x6+hOVrPAqVkArNpRFuJIjDE93ZgxYzj++OOb55977jlycnLIyclhw4YNrF+//rBtYmNjueCCCwA47rjj2LZtW3eF22WsZgGMSU8gMSaClTv2Meu4DP8bGGO6TWdrAMESHx/fPL1582YefvhhPvnkE1JSUrjiiivavJYhKiqqeTo8PJz6+vpuibUrWc0Cp0fU1BEpVrMwxnRIRUUFiYmJJCUlUVhYyJIlfffaYatZuLIzU3nk7c1U1tSTEG2HxRjjX05ODhMmTGDSpEmMHj2ak08+OdQhBU2fuQf3tGnT9EhufvTuxr1ctWA5z357BieNGdiFkRljOmrDhg2MHz8+1GH0OW0dVxFZoarT/G1rzVCu7BF2ktsYY3yxZOFKjotkTHo8q3bYxXnGGNOaJQuP7MxUVu4oo680zRljTFexZOGRk5lK6YFadpRW+S9sjDH9iCULj+zMFABWWlOUMca0YMnC46jBicRHhdtJbmOMacWShUd4mDBlRIrVLIzp584444zDLrB76KGH+M53vuNzm4QEZ1y5goICZs2a5XO//rr4P/TQQ1RVHWoKv/DCCykrC/0PWEsWreRkprKhcD/VtQ2hDsUYEyJz585l4cKFLZYtXLiQuXPn+t122LBhvPDCC51+7tbJYvHixaSkpHR6f10lqMlCRM4XkY0ikicihw2xKCKnichKEakXkVmt1t0rIutEZIOI/F666R6L2ZkpNDQqa/JDn8mNMaExa9YsXnnlFWpqagDYtm0bBQUFTJ06lbPPPpucnByOPfZY/vWvfx227bZt25g0aRIA1dXVzJkzh8mTJzN79myqq6uby914443NQ5vfeeedAPz+97+noKCAM888kzPPPBOArKwsiouLAXjggQeYNGkSkyZN4qGH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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.plot(model.history.history['loss'])\n",
    "plt.plot(model.history.history['val_loss'])\n",
    "plt.title(\"Model's Training & Validation loss across epochs\")\n",
    "plt.ylabel('Loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.legend(['Train', 'Validation'], loc='upper right')\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(model.history.history['acc'])\n",
    "plt.plot(model.history.history['val_acc'])\n",
    "plt.title(\"Model's Training & Validation Accuracy across epochs\")\n",
    "plt.ylabel('Accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.legend(['Train', 'Validation'], loc='upper right')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
